package com.atguigu.ssyx.product.service.impl;

import com.atguigu.ssyx.model.product.SkuAttrValue;
import com.atguigu.ssyx.model.product.SkuImage;
import com.atguigu.ssyx.model.product.SkuInfo;
import com.atguigu.ssyx.mq.constant.MqConst;
import com.atguigu.ssyx.mq.service.RabbitService;
import com.atguigu.ssyx.product.mapper.SkuInfoMapper;
import com.atguigu.ssyx.model.product.SkuPoster;
import com.atguigu.ssyx.product.service.SkuAttrValueService;
import com.atguigu.ssyx.product.service.SkuImageService;
import com.atguigu.ssyx.product.service.SkuInfoService;
import com.atguigu.ssyx.product.service.SkuPosterService;
import com.atguigu.ssyx.vo.product.SkuInfoQueryVo;
import com.atguigu.ssyx.vo.product.SkuInfoVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;

/**
 * <p>
 * sku信息 服务实现类
 * </p>
 *
 * @author ZhangYK
 * @since 2024-07-07
 */
@Service
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo> implements SkuInfoService {

    @Resource
    private SkuAttrValueService skuAttrValueService;
    @Resource
    private SkuImageService skuImageService;
    @Resource
    private SkuPosterService skuPosterService;

    @Resource
    private RabbitService rabbitService;

    /**
     * 分页查询
     * @param skuInfoPage
     * @param skuInfoQueryVo
     * @return
     */
    @Override
    public IPage<SkuInfo> findByPage(Page<SkuInfo> skuInfoPage, SkuInfoQueryVo skuInfoQueryVo) {
        String keyword = skuInfoQueryVo.getKeyword();
        String skuType = skuInfoQueryVo.getSkuType();
        Long categoryId = skuInfoQueryVo.getCategoryId();
        IPage<SkuInfo> page = lambdaQuery().like(!StringUtils.isEmpty(keyword), SkuInfo::getSkuName, keyword)
                .like(!StringUtils.isEmpty(skuType), SkuInfo::getSkuType, skuType)
                .eq(categoryId != null, SkuInfo::getCategoryId, categoryId)
                .page(skuInfoPage);
        return page;
    }
    /**
     * 添加商品
     * @param skuInfoVo
     */
    @Override
    public void saveSkuInfo(SkuInfoVo skuInfoVo) {
        //保存sku信息
        SkuInfo skuInfo = new SkuInfo();
        BeanUtils.copyProperties(skuInfoVo, skuInfo);
        save(skuInfo);
        //保存sku商品平台属性信息
        List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
        if (!CollectionUtils.isEmpty(skuAttrValueList)) {
            int srot = 1;
            for (SkuAttrValue skuAttrValue : skuAttrValueList) {
                skuAttrValue.setSkuId(skuInfo.getId());
                skuAttrValue.setSort(srot);
                srot++;
            }
            skuAttrValueService.saveBatch(skuAttrValueList);
        }
        //保存商品图片信息
        List<SkuImage> skuImageList = skuInfoVo.getSkuImagesList();
        if (!CollectionUtils.isEmpty(skuImageList)){
            int sort = 1;
            for (SkuImage skuImage : skuImageList){
                skuImage.setSort(sort);
                skuImage.setSkuId(skuInfo.getId());
                sort++;
            }
            skuImageService.saveBatch(skuImageList);
        }
        //保存商品海报
        List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
        if (!CollectionUtils.isEmpty(skuPosterList)){
            for (SkuPoster skuPoster : skuPosterList){
                skuPoster.setSkuId(skuInfo.getId());
            }
            skuPosterService.saveBatch(skuPosterList);
        }

    }
    /**
     * 获取商品
     * @param id
     * @return
     */
    @Override
    public SkuInfoVo getSkuInfo(Long id) {
        SkuInfoVo skuInfoVo = new SkuInfoVo();
        //根据id查询sku基本信息
        SkuInfo skuInfo = getById(id);
        BeanUtils.copyProperties(skuInfo, skuInfoVo);
        //根据id查询图片列表信息
        List<SkuImage> skuImageList = skuImageService.lambdaQuery()
                .eq(SkuImage::getSkuId, id)
                .list();
        skuInfoVo.setSkuImagesList(skuImageList);
        //根据id查询商品海报信息
        List<SkuPoster> skuPosterList = skuPosterService.lambdaQuery()
                .eq(SkuPoster::getSkuId, id)
                .list();
        skuInfoVo.setSkuPosterList(skuPosterList);
        //根据id查询商品属性信息
        List<SkuAttrValue> skuAttrValueList = skuAttrValueService.lambdaQuery()
                .eq(SkuAttrValue::getSkuId, id)
                .list();
        skuInfoVo.setSkuAttrValueList(skuAttrValueList);
        return skuInfoVo;
    }

    /**
     * 修改商品
     * @param skuInfoVo
     */
    @Override
    public void updateSkuInfo(SkuInfoVo skuInfoVo) {
        //修改sku基本信息
        SkuInfo skuInfo = new SkuInfo();
        BeanUtils.copyProperties(skuInfoVo, skuInfo);
        updateById(skuInfo);

        Long skuId = skuInfoVo.getId();
        //海报信息
        skuPosterService.lambdaUpdate()
                .eq(SkuPoster::getSkuId, skuId)
                .remove();
        List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
        if (!CollectionUtils.isEmpty(skuPosterList)){
            for (SkuPoster skuPoster : skuPosterList){
                skuPoster.setSkuId(skuId);
            }
            skuPosterService.saveBatch(skuPosterList);
        }

        //商品图片
        skuImageService.lambdaUpdate()
                .eq(SkuImage::getSkuId, skuId)
                .remove();
        List<SkuImage> skuImageList = skuInfoVo.getSkuImagesList();
        if (!CollectionUtils.isEmpty(skuImageList)){
            int sort = 1;
            for (SkuImage skuImage : skuImageList){
                skuImage.setSort(sort);
                skuImage.setSkuId(skuId);
                sort++;
            }
            skuImageService.saveBatch(skuImageList);
        }

        //商品属性
        skuAttrValueService.lambdaUpdate()
                .eq(SkuAttrValue::getSkuId, skuId)
                .remove();
        List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
        if (!CollectionUtils.isEmpty(skuAttrValueList)) {
            int srot = 1;
            for (SkuAttrValue skuAttrValue : skuAttrValueList) {
                skuAttrValue.setSkuId(skuId);
                skuAttrValue.setSort(srot);
                srot++;
            }
            skuAttrValueService.saveBatch(skuAttrValueList);
        }
    }
    /**
     * 商品审核
     * @param skuId
     * @param status
     */
    @Override
    public void check(Long skuId, Integer status) {
        // 更改发布状态
        SkuInfo skuInfoUp = getById(skuId);
        skuInfoUp.setCheckStatus(status);
        baseMapper.updateById(skuInfoUp);
    }
    /**
     * 商品上下架
     * @param skuId
     * @param status
     */
    @Override
    public void publish(Long skuId, Integer status) {
        if (status == 1){//上架
           SkuInfo skuInfoUp = getById(skuId);
           skuInfoUp.setPublishStatus(status);
           baseMapper.updateById(skuInfoUp);
           //todo 整合mq把数据同步到es
            rabbitService.sendMassage(MqConst.EXCHANGE_GOODS_DIRECT,
                    MqConst.ROUTING_GOODS_UPPER,
                    skuId);
        }else {
            SkuInfo skuInfoUp = getById(skuId);
            skuInfoUp.setPublishStatus(status);
            baseMapper.updateById(skuInfoUp);
            //todo 整合mq把数据同步到es
            rabbitService.sendMassage(MqConst.EXCHANGE_GOODS_DIRECT,
                    MqConst.ROUTING_GOODS_LOWER,
                    skuId);
        }
    }

    /**
     * 根基商品id、返回商品列表
     * @param skuIdList
     * @return
     */
    @Override
    public List<SkuInfo> findSkuInfoList(List<Long> skuIdList) {
        if (CollectionUtils.isEmpty(skuIdList)){
            return null;
        }
        return listByIds(skuIdList);
    }
}
